# 一、什么是封装
# 在程序设计中，封装（Encapsulation）是对具体对象的一种抽象，即将某些部分隐藏起来，在程序外部看不到，其
# 含义是其他程序无法调用。
# 想要了解封装，就离不开“私有化”。也就是类的属性或者函数限制到限制在类中使用，而外部无法调用。
# 二、为什么要用封装
# 1、封装数据：保护隐私
# 2、封装方法：隔离复杂度（只保留部分接口对外使用）

class User(object):
    def __init__(self, name, age, city):
        self.__name = name  # 封装的属性 私有变量
        self.__age = age
        self._city = city  # 单下划线标识 受保护的变量 不要随便用 私有变量

    def __name_age(self):  # 封装方法
        return "name: %s; age: %s" % (self.__name, self.__age)

    def get_name_age(self):
        return self.__name_age()


jmz = User('jmz', 13, "成都")
# print(jmz.__name)   #会报错AttributeError: 'User' object has no attribute '__name'
print(jmz.get_name_age())
print(jmz._city)
print(jmz.__dict__)  # {'_User__name': 'jmz', '_User__age': 13, '_city': '成都'} 只是属性前加了_类名
# 的封装并不是真正意义上的外部无法调用，与java ，PHP不同，Python如果调用封装的属性或方法，需要在方法和属性前加_类名（如果真的这样做了，那么与非封装方法、属性有什么区别呢）
print(jmz._User__name)  # 不推荐这么访问 直接写get获取
print(jmz._User__name_age())  # 不推荐这么访问 直接写get获取

'''
输出结果
name: jmz; age: 13
'''
